ICTSC2018 本戦 問題解説: トラブルが起こるのは筋肉が足りないから!!!
問題文
同期から次の依頼がありました。
「会社の上司から勉強用にとサーバーをいただきました!
Webページを立ててみたかったのでNginxをインストールしようとしていたのですが、
sudo apt-get install nginx
をするとエラーが出てしまってインストールできないんです…
どうしたら良いんですかね…?」
問題を解決して、インストールがエラーや警告なしで成功するようにしてください。
問題のスタート状態
- サーバーへのHTTP通信が失敗する
問題のゴール状態
- Nginxがapt-getによってエラーや警告なしにインストールされている
- サーバーへHTTP通信ができる
トラブルの概要
Nginxをインストールしようとしたがエラーが発生してインストールが完了しない。
解説
今回のトラブルの原因は /var/log
配下にあるファイル全てにi属性(Immutable属性)が付与されていたからでした。
今回のトラブルが起こる流れとして /var/log
配下にあるdpkg.logをアップデートしようとするとコピーなどは成功するが、インストール後スクリプト(post_install
)の実行時にdpkg.logファイルの権限変更(chmod)が失敗し、インストール失敗(再インストール)としてマークされます
そして、次回インストール時にpost_install
スクリプトが実行されるように予約がされます。
なので、Nginx(その他のパッケージ)をインストールしようとすると再インストールがマークされたdpkgが優先的にインストールされようとしますが、同じ理由で再失敗するのでそれ以降のインストールが無視される(インストール失敗とマークされる)といった流れでした。
ですので、今回は以下のコマンドでdpkg.log
のi属性をはずしたらインストールは完了します。
また、今回のゴールはNginxがapt-getによってエラーや警告なしにインストールされているも含まれています。
エラーや警告を解決していない回答が多く見られました。
今回エラーや警告が出ていた原因は/var/logのaptディレクトリにもi属性が付与されていたためです。
なので、aptディレクトリもi属性をはずしたら今回のトラブルは解決です。
回答例
50%
$ cd /var/log
$ sudo chattr -i dpkg.log
もしくは
$ sudo rm -rf /var/lib/dpkg/info/dpkg.postinst
$ sudo rm -rf /var/lib/dpkg/info/dpkg.postrm
$ sudo dpkg --configure dpkg
以上のようにNginxのインストールに成功すれば手段は問わず50%の点数を与えました。
100%
$ cd /var/log
$ sudo chattr -i *
$ sudo apt-get install nginx
2行目が sudo chattr -i apt
でも問題ありません。
Nginxのインストール時にエラーや警告がでなければ100%の点数を与えました。
採点基準
- sudo apt-get install nginxで正常にインストールされない。(0%)
- sudo apt-get install nginxでインストールされHTTP通信はできるが、インストール時にwarningが消えていない。(50%)
- sudo apt-get install nginx正常にインストールされHTTP通信ができ、インストール時にwarningがでない。(100%)